/***********************************************
 **** 版权声明处 **
 ****  为了方便阅读和维护，请严格遵守相关代码规范，谢谢   ****
 *******************************************/
package bpm.editor
{
	import bpm.graphic.Graph;
	import bpm.graphic.Renderer;
	
	import flash.display.Bitmap;
	import flash.display.DisplayObject;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	import mx.controls.Alert;
	import mx.core.DragSource;
	import mx.core.IVisualElement;
	import mx.core.UIComponent;
	import mx.graphics.ImageSnapshot;
	import mx.managers.DragManager;
	
	import spark.components.Image;
	import spark.layouts.supportClasses.LayoutBase;

	/*******************************************
	 **** huangjixin,2012-11-15,上午11:33:37 **
	 **** 请一句话表述该类主要作用  **
	 *******************************************/
	/**
	 * 元素面板，放置图形元素。 
	 * @author huangjixin
	 * 
	 */
	public class DiagramPalette extends Graph
	{
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 类私有静态变量和静态常量声明处。（全部大写，使用下划线进行分割）
		// 例如：private static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 类公有静态变量和静态常量声明处。（全部大写，使用下划线进行分割）
		// 例如：public static const EXAMPLE:String = "example";
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// private 私有变量声明处，请以“_”开头定义变量
		// 例如：private var _example:String;
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// public 公有变量声明处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		private var _data:Object;
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 构造函数，初始化相关工作可以放在里面
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		public function DiagramPalette()
		{
			super();
			super.removeDragEventListener();
		}//构造函数结束
		
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// getter和setter函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		
		/**
		 *  
		 * @return 
		 * 
		 */
		public function get data():Object
		{
			return _data;
		}
		
		/**
		 * 
		 * @param value
		 * 
		 */
		public function set data(value:Object):void
		{
			_data = value;
			
			_data.addEventListener(MouseEvent.MOUSE_DOWN, onElementMouseDown);
		}

		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// 相关事件响应函数和逻辑函数存放处
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

		protected function addEventListeners():void
		{
			var numEle:int=this.numElements;
			var element:IVisualElement;
			for (var i:int=0; i < numEle; i++)
			{
				element = getElementAt(i);
				/*if(uiComponent.hasOwnProperty("graph")){
					var graph:Graph = uiComponent["graph"];
					removeDragListener(graph);
				}*/
				element.addEventListener(MouseEvent.MOUSE_DOWN, onElementMouseDown);
			}
		}
		/**
		 * 该函数用于做拖拽准备。  
		 * @param event
		 * 
		 */
		protected function onElementMouseDown(event:MouseEvent):void
		{
			//拒绝为不是Node的元素做拖拽。
			if(!event.currentTarget is Renderer){
				return; 
			}
			//--------------------------
			// 先获得拖拽事件源，再生成图像作为拖拽代理；
			//--------------------------
			var dragSrc:UIComponent = event.currentTarget as UIComponent;
			
			//--------------------------
			// 确定好目标偏移量
			//--------------------------
			var hDistance:Number=0;
			var vDistance:Number=0;
			var node:Renderer = Renderer(event.currentTarget);
			hDistance=mouseX - node.x;
			vDistance=mouseY - node.y;
			
			var dragSource:DragSource = new DragSource();
			var object:Object={};
			object.hDistance=hDistance;
			object.vDistance=vDistance;
			dragSource.addData(object, Graph.DATA_FORMAT);

			var cloneRenderer:Renderer = node.clone();
			object.cloneRenderer = cloneRenderer;
			//生成拖拽图片
			var image:Image=new Image();
			image.source=new Bitmap(ImageSnapshot.captureBitmapData(event.currentTarget as UIComponent));
			//--------------------------
			// 拖拽开始
			//--------------------------
			var point:Point = new Point(mouseX,mouseY);
			point = localToGlobal(point);
			DragManager.doDrag(node, dragSource, event,cloneRenderer,node.x,node.y,1);
		}
		
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		// override 覆盖函数
		//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
		override protected function commitProperties():void{
			super.commitProperties();
			
			//--------------------------
			// 添加拖拽侦听。
			//--------------------------
			addEventListeners();
		}
		
	}//类结束
}//包结束